/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sys.utils;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.Normalizer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.text.MaskFormatter;
import org.ini4j.Ini;
import org.joda.time.DateTime;
import org.joda.time.Days;
import sys.bean.PedidoBean;

/**
 *
 * @author Cesar Daniel
 */
public class Utils {

    public static void maximizarDialog(JDialog windows) {
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        screen = new Dimension((int) screen.getWidth(), (int) screen.getHeight() - 40);
        windows.setSize(screen);
        windows.setLocationRelativeTo(null);
    }

    @SuppressWarnings("empty-statement")
    public static String nomeRelatorio() {
        SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss");;
        Date data = new Date();
        String dataFinal = formato.format(data);
        String nomeRelatorio = "Relatorio_" + dataFinal + ".pdf";

        return nomeRelatorio;
    }

    /*
     fechar tela pressionando esc
     */
    public static void escClose(final JDialog dialog) {
        ActionListener escListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.dispose();
            }
        };

        dialog.getRootPane().registerKeyboardAction(escListener, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);

    }

    public static void escClose(final JFrame frame) {
        ActionListener escListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                frame.dispose();
            }
        };
        frame.getRootPane().registerKeyboardAction(escListener, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);

    }

    /*
     * retornando codigo correto para utilizar. Sistema da SP trabalha com
     * números com a necessidade de se conter zeros a esquerda.
     */
    public static String codCorreto(String cod, int size) {

        String codCorreto = "";

        switch (size) {

            case 7:
                if (cod.length() == 1) {
                    codCorreto = "000000" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = "00000" + cod;
                }
                if (cod.length() == 3) {
                    codCorreto = "0000" + cod;
                }
                if (cod.length() == 4) {
                    codCorreto = "000" + cod;
                }
                if (cod.length() == 5) {
                    codCorreto = "00" + cod;
                }
                if (cod.length() == 6) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 7) {
                    codCorreto = cod;
                }
                break;
            case 6:
                if (cod.length() == 1) {
                    codCorreto = "00000" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = "0000" + cod;
                }
                if (cod.length() == 3) {
                    codCorreto = "000" + cod;
                }
                if (cod.length() == 4) {
                    codCorreto = "00" + cod;
                }
                if (cod.length() == 5) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 6) {
                    codCorreto = cod;
                }
                break;

            case 5:
                if (cod.length() == 1) {
                    codCorreto = "0000" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = "000" + cod;
                }
                if (cod.length() == 3) {
                    codCorreto = "00" + cod;
                }
                if (cod.length() == 4) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 5) {
                    codCorreto = cod;
                }
                break;

            case 4:
                if (cod.length() == 1) {
                    codCorreto = "000" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = "00" + cod;
                }
                if (cod.length() == 3) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 4) {
                    codCorreto = cod;
                }
                break;

            case 3:
                if (cod.length() == 1) {
                    codCorreto = "00" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 3) {
                    codCorreto = cod;
                }
                break;

            case 2:
                if (cod.length() == 1) {
                    codCorreto = "0" + cod;
                }
                if (cod.length() == 2) {
                    codCorreto = cod;
                }
                break;

        }
        return codCorreto;
    }
    /*
     * retorna quantidade de dias trabalhados no periodo
     *
     */

    public static int calcDiasTrabalhados(String dtInicial, String dtFinal) throws SQLException, IOException {

        int dTrab = 0;

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C13DATA "
                + "FROM SPAC13 "
                + "WHERE C13DATA BETWEEN '" + dtInicial + "' AND '" + dtFinal + "' "
                + "GROUP BY C13DATA";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            dTrab++;
        }

        stmt.close();
        con.close();

        return dTrab;

    }

    public static List<PedidoBean> listaDiasTrabalhados(String dtInicial, String dtFinal) throws SQLException, IOException {

        List<PedidoBean> lista = new ArrayList<>();

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C13DATA "
                + "FROM SPAC13 "
                + "WHERE C13DATA BETWEEN '" + dtInicial + "' AND '" + dtFinal + "' "
                + "GROUP BY C13DATA";

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            PedidoBean pedido = new PedidoBean();
            pedido.setData(rs.getString("C13DATA"));
            lista.add(pedido);
        }

        stmt.close();
        con.close();

        return lista;

    }

    /*
     * retornando primeiro ou ultimo dia do mês
     *
     */
    public static String retornaData(Date data, int firstOrLast, int format) {
        /*
         * firstOrLast: caso firstOrLast seja igual a 0, alteramos o primeiro
         * dia da data; caso firstOrLast seja igual a 1, alteramos o ultimo dia
         * da data
         *
         * format: altera a data conforme acima (0 primeiro dia, 1 ultimo dia) e
         * retorna a data no formato do Brasil
         */
        String dataCorreta;
        SimpleDateFormat formBancoSpac = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat formDataBr = new SimpleDateFormat("dd/MM/yyyy");
        Calendar vData = Calendar.getInstance();

        if (firstOrLast == 0) {
            vData.setTime(data);
            if (format == 0) {
                dataCorreta = formBancoSpac.format(data).substring(0, formBancoSpac.format(data).length() - 2) + "01";
            } else {
                //aqui
                String temp = formDataBr.format(data).substring(2);
                dataCorreta = "01" + temp;
            }
        } else {
            vData.setTime(data);
            if (format == 0) {
                dataCorreta = formBancoSpac.format(data).substring(0, formBancoSpac.format(data).length() - 2) + vData.getActualMaximum(Calendar.DAY_OF_MONTH);
            } else {
                //aqui
                String temp = formDataBr.format(data).substring(2);
                dataCorreta = vData.getActualMaximum(Calendar.DAY_OF_MONTH) + temp;
            }
        }
        return dataCorreta;
    }

    public static int diasAtraso(String dateOne, String dateTwo) {

        int qtdDias = 0;
        try {
            if (dateOne.equals("") || dateTwo.equals("")) {
            } else {
                String anoV = dateOne.substring(0, dateOne.length() - 4);
                String mesV = dateOne.substring(4, dateOne.length() - 2);
                String diaV = dateOne.substring(6);

                String anoA = dateTwo.substring(0, dateTwo.length() - 4);
                String mesA = dateTwo.substring(4, dateTwo.length() - 2);
                String diaA = dateTwo.substring(6);

                DateTime start = new DateTime(Integer.parseInt(anoV), Integer.parseInt(mesV), Integer.parseInt(diaV), 0, 0, 0, 0);
                DateTime end = new DateTime(Integer.parseInt(anoA), Integer.parseInt(mesA), Integer.parseInt(diaA), 0, 0, 0, 0);
                Days days = Days.daysBetween(start, end);
                qtdDias = days.getDays();
            }
        } catch (org.joda.time.IllegalInstantException e) {
            qtdDias = 0;
        }

        return qtdDias;
    }

    /*
     subtrai um dia na data passada como parâmetro
     */
    public static Date subtrairDias(Date data, int qtdDias) {
        DateTime dt = new DateTime(data);
        return dt.minusDays(qtdDias).toDate();
    }

    /*
     Acrescenta um dia na data passada como parâmetro
     */
    public static Date addDias(Date data, int qtdDias) {
        DateTime dt = new DateTime(data);
        return dt.plusDays(qtdDias).toDate();
    }

    /*
     retornando quantidade de dias de um período recebendo Date como parâmetro
     */
    public static int calQtdDias(Date dataInicial, Date dataFinal) {
        DateTime start = new DateTime(dataInicial);
        DateTime end = new DateTime(dataFinal);
        Days days = Days.daysBetween(start, end);
        return days.getDays();
    }

    //retornando quantidade de dias de um período
    public static int calcQtdDias(String dataInicial, String dataFinal) {

        int anoV = Integer.parseInt(dataInicial.substring(0, dataInicial.length() - 4));
        int mesV = Integer.parseInt(dataInicial.substring(4, dataInicial.length() - 2));
        int diaV = Integer.parseInt(dataInicial.substring(6));

        int anoA = Integer.parseInt(dataFinal.substring(0, dataFinal.length() - 4));
        int mesA = Integer.parseInt(dataFinal.substring(4, dataFinal.length() - 2));
        int diaA = Integer.parseInt(dataFinal.substring(6));

        DateTime start = new DateTime(anoV, mesV, diaV, 0, 0, 0, 0);
        DateTime end = new DateTime(anoA, mesA, diaA, 0, 0, 0, 0);
        Days days = Days.daysBetween(start, end);

        return days.getDays();


        /*
         *
         * qtdDias entre período descontando sabado e domingo DateFormat df =
         * new SimpleDateFormat("dd/MM/yyyy"); Date dtInicial =
         * df.parse(inicio); Date dtFinal = df.parse(fim);
         *
         * int cont = 0;
         *
         * Calendar dtInicio = Calendar.getInstance(); Calendar dtFim =
         * Calendar.getInstance();
         *
         * dtInicio.setTime(dtInicial); dtFim.setTime(dtFinal);
         *
         * int dtInicioSD = dtInicio.get(Calendar.DAY_OF_YEAR); int dtFimSD =
         * dtFim.get(Calendar.DAY_OF_YEAR);
         *
         * for (; dtInicioSD <= dtFimSD; dtInicioSD++) { if
         * (dtInicio.get(Calendar.DAY_OF_WEEK) == 0 ||
         * dtInicio.get(Calendar.DAY_OF_WEEK) == 7) { cont++; }
         * dtInicio.add(Calendar.DATE, 1); }
         *
         * return ((dtFinal.getTime() - dtInicial.getTime() + 3600000L) /
         * 86400000L) - cont; *?
         */
    }

    /*
     * validando cnpj
     *
     */
    public static boolean validaCNPJ(String str_cnpj) {
        int soma = 0, dig;
        String cnpj_calc = str_cnpj.substring(0, 12);

        if (str_cnpj.length() != 14) {
            return false;
        }

        char[] chr_cnpj = str_cnpj.toCharArray();

        /*
         * Primeira parte
         */
        for (int i = 0; i < 4; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
                soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);

        cnpj_calc += (dig == 10 || dig == 11)
                ? "0" : Integer.toString(dig);

        /*
         * Segunda parte
         */
        soma = 0;
        for (int i = 0; i < 5; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
                soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);
        cnpj_calc += (dig == 10 || dig == 11)
                ? "0" : Integer.toString(dig);

        return str_cnpj.equals(cnpj_calc);
    }

    /*
     * Criando mascaras
     *
     */
    public static MaskFormatter Mascara(String Mascara) {

        MaskFormatter F_Mascara = new MaskFormatter();
        try {
            F_Mascara.setMask(Mascara); //Atribui a mascara  
            F_Mascara.setPlaceholderCharacter(' '); //Caracter para preencimento   
        } catch (ParseException ex) {
            Mensagens.msgErro("erro\n" + ex.getMessage());
        }
        return F_Mascara;
    }

    /*
     * converte data do banco da SP 20140101 para data correta 01/01/2014
     */
    public static String dataCorreta(String dataSP) {

        String dataCorreta = "";
        if (dataSP.length() == 8) {
            String ano = dataSP.substring(0, dataSP.length() - 4);
            String mes = dataSP.substring(4, dataSP.length() - 2);
            String dia = dataSP.substring(6);

            dataCorreta += dia + "/" + mes + "/" + ano;
        } else {
            dataCorreta = "";
        }

        return dataCorreta;
    }

    /*
     retornando a hora no formato correto 00:00:00
     */
    public static String horaCorreta(String horaSp) {

        String horaCorreta = "";

        String hora = horaSp.substring(0, horaSp.length() - 4);
        String minuto = horaSp.substring(2, horaSp.length() - 2);
        String segundo = horaSp.substring(4);

        horaCorreta += hora + ":" + minuto + ":" + segundo;

        return horaCorreta;
    }

    /*
     * Devolve uma string com o valor correto para utilizar em cálculos
     */
    public static String numParaCalculos(String entrada) {
        // Padrão que caracteriza caracteres numéricos  
        Pattern numericos = Pattern.compile("([0-9])");

        // Colocando o texto no padrão para ver o que encaixa  
        Matcher encaixe = numericos.matcher(entrada);

        // Criando um buffer de saída, que é uma solução  
        // mais otimizada do que ir concatenando uma String  
        StringBuilder saida = new StringBuilder();

        /*
         * A cada número encontrado adiciona-se esse número ao buffer
         */
        while (encaixe.find()) {
            saida.append(encaixe.group());
        }

        String val = saida.toString();

        StringBuilder valFinal = new StringBuilder(val);
        valFinal.insert(val.length() - 2, '.');

        // Devolvendo o buffer convertido em String  
        return valFinal.toString();
    }

    /*
     * verificando o serial no arquivo .ini
     */
    public static void verificaLicenca() {
        System.out.println("caiu no verifica licença");
        String cnpj = "";
        Date dataRegistro = null;
        Date vencimentoLicenca = null;

        try {
            Ini ini = new Ini(new File(dirFileConfig()));
            String serial = ini.get("PARAMETROS", "serial");

            String dados[] = Encrypter.decrypt(serial).split("=");

            cnpj = dados[0];
            dataRegistro = stringToDate(dados[1]);
            vencimentoLicenca = stringToDate(dados[2]);

            Date dtAtual = new Date();

            if (vencimentoLicenca.compareTo(dtAtual) < 0) {

            }
            if (dataRegistro.compareTo(dtAtual) > 0) {
            }
        } catch (IOException | EncryptorException ex) {
            Mensagens.msgErro("erro\n" + ex.getMessage());
        }
    }
    /*
     * converte string para date
     */

    public static Date stringToDate(String date) {
        Date data = null;
        try {
            data = new SimpleDateFormat("dd/MM/yyyy").parse(date);
        } catch (ParseException ex) {
            Mensagens.msgErro("Erro ao converter data!\n" + ex.getMessage());
        }
        return data;
    }

    public static java.sql.Date convert(java.util.Date var) {
        int day = var.getDate();
        int mom = var.getMonth();
        int year = var.getYear();
        return new java.sql.Date(year, mom, day);
    }

    //tornando arquivo de configuração oculto
    public static void ocultar() {
        try {
            Runtime.getRuntime().exec("attrib +H " + dirFileConfig());
        } catch (IOException ex) {
            Mensagens.msgErro("erro\n" + ex.getMessage());
        }
    }

    public static void desocultar() {
        try {
            Runtime.getRuntime().exec("attrib -H +A " + dirFileConfig());
        } catch (IOException ex) {
            Mensagens.msgErro("erro\n" + ex.getMessage());
        }
    }

    public static String dirFileConfig() {
        return "C:/spac/SPManager.ini";
    }

    public static String dirFileCalcs() {
        return "C:/spac/calcs.ini";
    }

    public static String dirFileTraco() {
        return "C:/spac/traco.ini";
    }

    public static String foneCorreto(String dddFone, String fone) {
        String dddCorreto = "";
        String foneCorreto = "";

        if (dddFone.length() != 2 || dddFone.length() != 3) {
            dddCorreto = "(   ) ";
        }
        if (dddFone.length() == 2) {
            dddCorreto = "(0" + dddFone + ") ";
        }
        if (dddFone.length() == 3) {
            dddCorreto = "(" + dddFone + ") ";
        }

        if (fone.length() != 8) {
            foneCorreto = "    -    ";
        }
        if (fone.length() == 7) {
            foneCorreto = fone.substring(0, fone.length() - 4) + "-" + fone.substring(3);
        }
        if (fone.length() == 8) {
            foneCorreto = fone.substring(0, fone.length() - 4) + "-" + fone.substring(4);
        }
        return dddCorreto + foneCorreto;
    }

    public static String cpfCnpjCorreto(String cpfCnpf) {
        String cpfCpnfFormadado = "";

        if (cpfCnpf.equals("") || cpfCnpf.length() != 11 || cpfCnpf.length() != 14) {
            cpfCpnfFormadado = cpfCnpf;
        }

        if (cpfCnpf.length() == 11) {
            String pParte = cpfCnpf.substring(0, cpfCnpf.length() - 8);
            String sParte = cpfCnpf.substring(3, cpfCnpf.length() - 5);
            String tParte = cpfCnpf.substring(6, cpfCnpf.length() - 2);
            String uParte = cpfCnpf.substring(9);
            cpfCpnfFormadado = (pParte + "." + sParte + "." + tParte + "-" + uParte);
        }

        if (cpfCnpf.length() == 14) {
            String pParte = cpfCnpf.substring(0, cpfCnpf.length() - 12);
            String sParte = cpfCnpf.substring(2, cpfCnpf.length() - 9);
            String tParte = cpfCnpf.substring(5, cpfCnpf.length() - 6);
            String qParte = cpfCnpf.substring(8, cpfCnpf.length() - 2);
            String uParte = cpfCnpf.substring(12);
            cpfCpnfFormadado = (pParte + "." + sParte + "." + tParte + "/" + qParte + "-" + uParte);
        }
        return cpfCpnfFormadado;
    }

    public static String removerAcento(String str) {
        String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
        Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
        return pattern.matcher(nfdNormalizedString).replaceAll("");
    }

    public static String retSituacao(String flag) {
        String situacao = "";
        if (flag.equals("A")) {
            situacao = "PENDENTE";
        }
        if (flag.equals("P")) {
            situacao = "PAGO";
        }
        return situacao;
    }

    public static String retTipoMoeda(String flag) {
        String tipoMoeda = "";

        if (flag.equals("D")) {
            tipoMoeda = "DINHEIRO";
        }
        if (flag.equals("C")) {
            tipoMoeda = "CHEQUE";
        }
        if (flag.equals("P")) {
            tipoMoeda = "CHEQUE PRE";
        }
        if (flag.equals("O")) {
            tipoMoeda = "OUTRAS MOEDAS";
        }
        return tipoMoeda;
    }

    /*
     lista de produtos cadastrados no arquivo tracos.ini
     */
    public List<String> listaProdutosConcreteira() throws IOException {
        List<String> listaProdutos = new ArrayList<>();
        try {
            Ini ini = new Ini(new FileReader(dirFileTraco()));
            for (String sectionName : ini.keySet()) {
                listaProdutos.add(sectionName);
            }
        } catch (FileNotFoundException ex) {
            Mensagens.msgErro("erro ao carregar blocos\n" + ex.getMessage());
        }
        return listaProdutos;
    }
}
